<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>iae-web2</title>
</head>
<body>
<h2>day240925</h2>
<ul>
    <li><a href="/am_web2_war/driverjs-demo/product-tours.html" target="_blank">新手指引</a> - html 版本</li>
    <li><a href="/am_web2_war/driverjs-demo/product-tours.jsp" target="_blank">新手指引</a> - jsp 版本 (!!此链接弃用!!。后续都通过下面的链接（servlet）进入，因为 jsp 需要用到 servlet 传递的值)</li>
    <li><a href="/am_web2_war/product-tours" target="_blank">新手指引</a> - servlet + jsp + cookie会话跟踪版本</li>
    <li><a href="/am_web2_war/day240925/hw-cookie" target="_blank">day240925/hw-cookie</a> - cookie 作业</li>
    <li><a href="/am_web2_war/pathInJspDemoServlet" target="_blank">pathInJspDemoServlet</a> - jsp 与它内部图片等资源之间路径关系的注意事项</li>
    <li><a href="/am_web2_war/day240925/path-in-jsp-demo.jsp" target="_blank">跳过 servlet，直接访问 jsp 页面</a> - 会找不到图片资源，因为 base 的 ${baseUrl} 没有值了，这个值是由 servlet 提供的，但是现在跳过它了。如何避免用户直接访问 jsp?</li>
    <li><a href="/am_web2_war/WEB-INF/jsp_in_web-inf_folder.jsp" target="_blank">直接访问 /WEB-INF/jsp_in_web-inf_folder.jsp</a> - 404 Not Found</li>
    <li><a href="/am_web2_war/jsp_in_web-inf_folder" target="_blank">通过 Servlet 内部转发的方式访问 jsp_in_web-inf_folder</a></li>
    <li><a href="/am_web2_war/hw-cookie-1" target="_blank">cookie 作业 - 1</a></li>
    <li><a href="/am_web2_war/hw-cookie-2" target="_blank">cookie 作业 - 2</a></li>
</ul>
<hr>

<h2>day240923</h2>
<ul>
    <li><a href="/am_web2_war/ELServlet" target="_blank">ELServlet</a> - (Servlet + JSP 各司其职)</li>
    <li><a href="/am_web2_war/JSTLForEachServlet" target="_blank">JSTLForEachServlet</a> - (Servlet + JSP 各司其职) - 常见的循环</li>
    <li><a href="/am_web2_war/JSTLIfServlet" target="_blank">JSTLIfServlet</a> - (Servlet + JSP 各司其职) - 常见的分支</li>
    <li><a href="/am_web2_war/AddCookieServlet">CookieServlet</a> - 往客户端写Cookie</li>
    <li><a href="/am_web2_war/SetSessionServlet" target="_blank">SetSessionServlet</a> - 在服务端临时保存数据 - session</li>
    <li><a href="/am_web2_war/GetSessionServlet" target="_blank">GetSessionServlet</a> - 从 session 中获取数据（Tomcat 默认存活时间 30 分钟，可配置）</li>
    <li><a href="/am_web2_war/day240923/note" target="_blank">day240923/note</a> + cookie 真实应用场景之一</li>
</ul>
<hr>

<h2>day240918</h2>
<h3>request</h3>
<ul>
    <li>
        <a href="/am_web2_war/RequestServlet1" target="_blank">RequestServlet1</a> - 你好，xxx （xxx的具体值通过 request.getParameter("name") 动态获取）
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet2" target="_blank">RequestServlet2</a> - 直接打印出 request 和 response 到底是由谁实现的
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet3" target="_blank">RequestServlet3</a>
        <p>输出：getMethod、getContextPath、getRequestURL、getRequestURI、getQueryString、getHeader("user-agent") 的具体值</p>
        <p>提醒：可以用这句获取跟操作系统无关的换行符 System.lineSeparator()</p>
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet4?username=用户名_GET&password=secret" target="_blank">RequestServlet4</a>
        <p>验证控制台输出</p>
        <p>在控制台输出用户传递过来的 username 和 password 的值</p>
        <p>request.getParameter("username")</p>
        <p>request.getParameter("password")</p>
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet4_1?username=用户名_GET&password=secret" target="_blank">RequestServlet4_1</a>
        <p>跟上一个效果一样，但是可以用另一个 url (/RequestServlet4_1) 访问同一个 Servlet</p>
    </li>
    <li>
        RequestServlet4 也要能支持 POST 请求。下图演示的是如何在 ***.http 文件，模拟发送 POST 请求<br>
        <img src="day240918/note/mock-do-post.png" width="500" alt="演示的是如何在这个文件，模拟发送 POST 请求">
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet5" target="_blank">RequestServlet5</a>
        <p>验证控制台输出</p>
        <p>功能：访问 RequestServlet5，实际上，RequestServlet5 的内部，调用了 RequestServlet6</p>
        <p>同时在 RequestServlet5 中可以额外传递数据给 RequestServlet6（request.setAttribute("key", "value")）</p>
        <p>RequestServlet6 可以通过 request.getAttribute("key") 获取</p>
    </li>
    <li>
        <a href="/am_web2_war/RequestServlet6" target="_blank">RequestServlet6</a>
        <p>验证控制台输出</p>
        <p>观察：直接访问 RequestServlet6 vs 通过 RequestServlet5 访问的差异</p>
        <p>同时在 RequestServlet5 中可以额外传递数据给 RequestServlet6（request.setAttribute("key", "value")）</p>
        <p>查看控制台的输出，此时在 RequestServlet6 中 request.getAttribute("attr1") 返回为 null</p>
    </li>
</ul>

<h3>response</h3>
<ul>
    <li>
        <a href="/am_web2_war/ResponseServlet1" target="_blank">ResponseServlet1</a> - 跳转 - setStatus(...) + setHeader("Location", "...")
        <p>观察跟之前讲的「转发」的差异 - request.getRequestDispatcher("...").forward(request, response)</p>
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet2" target="_blank">ResponseServlet2</a> - 复习 response.getWriter().write(...)
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet3" target="_blank">ResponseServlet3</a> - write img
        <p>除了往客户端写文本，也可以直接写图片等多媒体资源</p>
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet4" target="_blank">ResponseServlet4</a> - write img - IOUtils
        <p>引入第三方库，更方便完成 IO 相关操作</p>
        <img src="day240918/note/dependency-commons-io.png" width="500" alt="commons-io">
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet5" target="_blank">ResponseServlet5</a> - write img - Content-Disposition:attachment
        <p>服务端：设置符合协议的特定请求头；客户端：按照协议解析特定的请求头，并做相应处理</p>
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet6" target="_blank">ResponseServlet6</a> - write img - Content-Disposition:attachment;filename=custom-name.png
        <p>在前一个功能的基础上，让客户端按照指定的名称下载</p>
    </li>
    <li>
        <a href="/am_web2_war/ResponseServlet7" target="_blank">ResponseServlet7</a> - redirect - Cache-Control: no-cache
        <p>
            这个 Servlet 暂时可以先忽略，后续遇到再来回顾<br>
            如果后续遇到修改了跳转链接，发现短期内没生效，可能是客户端缓存了之前的地址<br>
            可以设置请求头 Cache-Control: no-cache 明确告诉客户端不要缓存
        </p>
    </li>
</ul>
<hr>

<h2>day240911</h2>
<ul>
    <li>
        <a href="https://gitee.com/iae23a12/home/tree/main/src/main/webapp/day240911/note" target="_blank">见 day240911 的笔记（home项目）</a>
    </li>
</ul>
<hr>

<h2>day240909</h2>
<ul>
    <li>
        <a href="https://gitee.com/iae23a12/home/tree/main/src/main/webapp/day240909/note" target="_blank">见 day240909 的笔记（home项目）</a>
    </li>
</ul>
<hr>

<h2>day240908</h2>
<p>
    <a href="/am_web2_war/lang">LangServlet</a> - 根据浏览器设置的首选语言自动决定显示什么内容
</p>
<p>
    <a href="/am_web2_war/lang?lan=zh">LangServlet</a> - 用户自己通过携带 lan 参数明确指定需要显示什么内容 - lan=zh - 中文
</p>
<p>
    <a href="/am_web2_war/lang?lan=en">LangServlet</a> - 用户自己通过携带 lan 参数明确指定需要显示什么内容 - lan=en - 英文
</p>
<p>
    <a href="lang" target="_blank">lang</a>, <a href="lan" target="_blank">lan</a> - 一个 Servlet 可以配置多个 URL
</p>
<p>
    <a href="config-by-xml-servlet" target="_blank">config-by-xml-servlet</a> - 通过 web.xml 的方式配置 Servlet，类似注解的 @WebServlet("/config-by-xml-servlet")
</p>
<p>
    <a href="request-demo1-servlet?page=1&lang=en" target="_blank">从 HTTP 协议的「请求行」部分获取各种常见信息</a>
</p>
<p>
    <a href="https://gitee.com/iae23a12/iae-web2/tree/main/src/main/webapp/day240908/note" target="_blank">详细笔记</a>
</p>

<hr>

<h2>day240904</h2>
<ul>
    <li>什么是 Servlet <br> <img src="day240908/note/img.png" width="500" alt="什么是 Servlet"></li>
    <li><a href="/am_web2_war/life-cycle" target="_blank">Servlet 生命周期</a> - 备注：看控制台的输出</li>
    <li><a href="day240904/login.html" target="_blank">MyFirstHttpServlet</a> - 继承 HttpServlet (之前是直接 implements Servlet) - 用户登录 - 重点关注 get/post 方法的区别</li>
    <li><a href="https://gitee.com/iae23a12/iae-web2/tree/main/src/main/webapp/day240904/note" target="_blank">详细笔记</a></li>
</ul>
<hr>

<h2>day240902</h2>
<ul>
    <li>
        <a href="https://gitee.com/iae23a12/iae-web2/tree/main/src/main/webapp/day240902/note" target="_blank">见 day240902 的笔记</a>
    </li>
</ul>
<hr>

<h2>day240823</h2>
<ul>
    <li>
        <a href="https://gitee.com/iae23a12/iae-web2/tree/main/src/main/webapp/day240823/note" target="_blank">见 day240823 的笔记</a>
    </li>
</ul>
<hr>

<h2>day240822</h2>
<ul>
    <li>
        <a href="https://gitee.com/iae23a12/iae-web2/tree/main/src/main/webapp/day240822/note" target="_blank">见 day240822 的笔记</a>
    </li>
</ul>
<hr>

</body>
</html>